package gui;

import gui.del_object.Del_Personne;
import gui.edit_objects.Edit_Personne;
import gui.list_objects.List_Activites;
import gui.list_objects.List_Lieux;
import gui.list_objects.result_recherche_activite_model;
import gui.list_objects.result_recherche_departement_model;
import gui.list_objects.result_recherche_pays_model;
import gui.list_objects.result_recherche_quartier_model;
import gui.list_objects.result_recherche_region_model;
import gui.list_objects.result_recherche_ville_model;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import objects.Activite;
import objects.Departement;
import objects.Pays;
import objects.Personne;
import objects.Quartier;
import objects.Region;
import objects.Ville;
import bdd_handler.ActiviteDAO;
import bdd_handler.DepartementDAO;
import bdd_handler.PaysDAO;
import bdd_handler.PersonneDAO;
import bdd_handler.QuartierDAO;
import bdd_handler.RegionDAO;
import bdd_handler.VilleDAO;
import bdd_handler.bdd;

public class Carnet_GUI extends JFrame implements ActionListener, ComponentListener, ListSelectionListener{
	private static final long serialVersionUID = 1L;
	private Personne[] liste_personne;
	private result_recherche_personne_model model;
	private bdd db=new bdd();
	private PersonneDAO pDAO=new PersonneDAO(db.getConnection());
	private ActiviteDAO aDAO = new ActiviteDAO(db.getConnection());

	private JMenuItem lieux, activites;
	private JButton valider, reset, newContact, editContact, supprContact;
	private JTextField recherche=new JTextField();
	private JTextField annee_min, annee_max;

	private JTable result;
	private JLabel count;

	private Pays[] liste_pays;
	private Region[] liste_regions;
	private Departement[] liste_departements;
	private Ville[] liste_villes;
	private Quartier[] liste_quartiers;
	private Activite[] liste_activites;

	private result_recherche_pays_model pModel;
	private JTable jt_pays;
	private result_recherche_region_model rModel;
	private JTable jt_regions;
	private result_recherche_departement_model dModel;
	private JTable jt_departements;
	private result_recherche_ville_model vModel;
	private JTable jt_villes;
	private result_recherche_quartier_model qModel;
	private JTable jt_quartiers;
	private  result_recherche_activite_model aModel;
	private JTable jt_activites;
	private PaysDAO paysDAO;
	private RegionDAO rDAO;
	private DepartementDAO dDAO;
	private VilleDAO vDAO;
	private QuartierDAO qDAO;

	public Carnet_GUI(){
		//definition fenêtre
		this.setTitle("Carnet d'adresses");
		this.setSize(900,750);
		this.setResizable(false);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.addComponentListener(this);

		//definition JPanel
		JPanel pan=new JPanel();
		pan.setLayout(null);
		this.setContentPane(pan);
		//definition champs internes

		//menu
		JMenuBar menu=new JMenuBar();
		JMenu listes=new JMenu("Listes");
		lieux=new JMenuItem("lieux");
		lieux.addActionListener(this);
		activites=new JMenuItem("activite");
		activites.addActionListener(this);
		listes.add(lieux);
		listes.add(activites);
		menu.add(listes);

		//recherche
		JLabel lbl=new JLabel("entrez le nom recherché:");
		valider=new JButton();
		JLabel lbl_annee_1=new JLabel("né(e) après");
		annee_min=new JTextField();
		JLabel lbl_annee_2=new JLabel("né(e) avant");
		annee_max=new JTextField();
		JLabel lbl_annee_3=new JLabel("(au format yyyy)");
		valider.setText("Rechercher");
		valider.addActionListener(this);
		reset=new JButton();
		reset.setText("Réinitialiser");
		reset.addActionListener(this);
		this.liste_personne = pDAO.findByName(recherche.getText());
		result=new JTable(model);
		this.model=new result_recherche_personne_model(liste_personne);
		result.getTableHeader().setReorderingAllowed(false);
		result.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		count=new JLabel(liste_personne.length+" résultat(s) trouvé(s)");

		newContact = new JButton();
		newContact.setText("Nouveau contact");
		newContact.addActionListener(this);
		editContact = new JButton();
		editContact.setText("Voir/Editer le contact");
		editContact.addActionListener(this);
		supprContact = new JButton();
		supprContact.setText("Supprimer le contact");
		supprContact.addActionListener(this);

		paysDAO=new PaysDAO(db.getConnection());
		rDAO=new RegionDAO(db.getConnection());
		dDAO=new DepartementDAO(db.getConnection());
		vDAO=new VilleDAO(db.getConnection());
		qDAO=new QuartierDAO(db.getConnection());
		aDAO=new ActiviteDAO(db.getConnection());
		liste_pays=paysDAO.findAll();
		pModel=new result_recherche_pays_model(liste_pays);
		jt_pays=new JTable(pModel);
		jt_pays.getTableHeader().setReorderingAllowed(false);
		jt_pays.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_pays.getSelectionModel().addListSelectionListener(this);
		rModel=new result_recherche_region_model();
		jt_regions=new JTable(rModel);
		jt_regions.getTableHeader().setReorderingAllowed(false);
		jt_regions.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_regions.getSelectionModel().addListSelectionListener(this);
		dModel=new result_recherche_departement_model();
		jt_departements=new JTable(dModel);
		jt_departements.getTableHeader().setReorderingAllowed(false);
		jt_departements.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_departements.getSelectionModel().addListSelectionListener(this);
		vModel=new result_recherche_ville_model();
		jt_villes=new JTable(vModel);
		jt_villes.getTableHeader().setReorderingAllowed(false);
		jt_villes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_villes.getSelectionModel().addListSelectionListener(this);
		qModel=new result_recherche_quartier_model();
		jt_quartiers=new JTable(qModel);
		jt_quartiers.getTableHeader().setReorderingAllowed(false);
		jt_quartiers.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_quartiers.getSelectionModel().addListSelectionListener(this);
		liste_activites=aDAO.findAll();
		aModel=new result_recherche_activite_model(liste_activites);
		jt_activites=new JTable(aModel);
		jt_activites.getTableHeader().setReorderingAllowed(false);
		jt_activites.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		jt_activites.getSelectionModel().addListSelectionListener(this);
		JScrollPane jsp_pays=new JScrollPane(jt_pays);
		JScrollPane jsp_regions=new JScrollPane(jt_regions);
		JScrollPane jsp_departements=new JScrollPane(jt_departements);
		JScrollPane jsp_villes=new JScrollPane(jt_villes);
		JScrollPane jsp_quartiers=new JScrollPane(jt_quartiers);
		JScrollPane jsp_activites=new JScrollPane(jt_activites);

		//ajout champs dans le JPanel
		pan.add(menu);	
		menu.setBounds(0, 0, 1000, 20);
		pan.add(lbl);
		lbl.setBounds(480, 30, 200, 20);
		pan.add(lbl_annee_1);
		lbl_annee_1.setBounds(480, 60, 200, 20);
		pan.add(lbl_annee_2);
		lbl_annee_2.setBounds(480, 90, 200, 20);
		pan.add(annee_min);
		annee_min.setBounds(690, 60, 100, 20);
		pan.add(annee_max);
		annee_max.setBounds(690, 90, 100, 20);
		pan.add(lbl_annee_3);
		lbl_annee_3.setBounds(800,75, 150, 20);
		pan.add(reset);
		reset.setBounds(580, 690, 150, 20);
		pan.add(recherche);
		recherche.setBounds(690, 30, 200, 20);
		pan.add(valider);
		valider.setBounds(740, 690, 150, 20);
		JScrollPane jsp_result=new JScrollPane(result);
		pan.add(jsp_result);
		jsp_result.setBounds(10, 30, 450, 520);
		pan.add(count);
		count.setBounds(10, 550, 200, 20);
		pan.add(newContact);
		newContact.setBounds(100, 600, 200, 20);
		pan.add(editContact);
		editContact.setBounds(100, 630, 200, 20);
		pan.add(supprContact);
		supprContact.setBounds(100, 660, 200, 20);
		pan.add(jsp_pays);
		jsp_pays.setBounds(480,120,200,90);
		pan.add(jsp_regions);
		jsp_regions.setBounds(690, 120, 200, 90);
		pan.add(jsp_departements);
		jsp_departements.setBounds(480, 220, 200, 90);
		pan.add(jsp_villes);
		jsp_villes.setBounds(690, 220, 200, 90);
		pan.add(jsp_quartiers);
		jsp_quartiers.setBounds(480, 320, 200, 90);
		pan.add(jsp_activites);
		jsp_activites.setBounds(480	, 420, 200, 90);

		//afficher la fenetre
		this.setVisible(true);
	}


	public void search(){
		try
		{
			if(!annee_min.getText().equals(""))
				Integer.parseInt(annee_min.getText());
			if(!annee_max.getText().equals(""))
				Integer.parseInt(annee_max.getText());
		}
		catch(Exception e)
		{
			JOptionPane.showMessageDialog(this.getContentPane(), "les années doivent être écrites au format yyyy.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
			return;
		}

		String id_activite;
		if(jt_activites.getSelectedRow()<0 || (int)aModel.getValueAt(0, 3)==-1)
		{
			id_activite="";
		}
		else
			id_activite=""+aModel.getValueAt(jt_activites.getSelectedRow(), 3);

		char lieu;
		int id_lieu;
		if(jt_pays.getSelectedRow()>=0 && (int)pModel.getValueAt(0, 1)!=-1)
		{
			if(jt_regions.getSelectedRow()>=0 && (int)rModel.getValueAt(0, 1)!=-1)
			{
				if(jt_departements.getSelectedRow()>=0 && (int)dModel.getValueAt(0, 1)!=-1)
				{
					if(jt_villes.getSelectedRow()>=0 && (int)vModel.getValueAt(0, 1)!=-1)
					{
						if(jt_quartiers.getSelectedRow()>=0 && (int)qModel.getValueAt(0, 1)!=-1)
						{
							lieu='q';
							id_lieu=(int)qModel.getValueAt(jt_quartiers.getSelectedRow(), 1);
						}	
						else
						{
							lieu='v';
							id_lieu=(int)vModel.getValueAt(jt_villes.getSelectedRow(), 1);
						}
					}
					else
					{
						lieu='d';
						id_lieu=(int)dModel.getValueAt(jt_departements.getSelectedRow(), 1);
					}
				}
				else
				{
					lieu='r';
					id_lieu=(int)rModel.getValueAt(jt_regions.getSelectedRow(), 1);
				}
			}
			else
			{
				lieu='p';
				id_lieu=(int)pModel.getValueAt(jt_pays.getSelectedRow(), 1);
			}
				
		}
		else
		{
			lieu='n';
			id_lieu=-1;
		}

		liste_personne=pDAO.findMulti(recherche.getText(), annee_min.getText(), annee_max.getText(), id_activite, lieu, id_lieu);
		this.model.setNewData(liste_personne);
		this.result.setModel(this.model);
		this.count.setText(liste_personne.length+" résultat(s) trouvé(s)");
		this.result.revalidate();
		this.count.revalidate();
		this.result.repaint();
		this.count.repaint();
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		Object source=e.getSource();
		if(source==valider)
		{
			search();
		}
		if(source==reset)
		{
			recherche.setText("");
			recherche.revalidate();
			recherche.repaint();
			annee_min.setText("");
			annee_min.revalidate();
			annee_min.repaint();
			annee_max.setText("");
			annee_max.revalidate();
			annee_max.repaint();
			update_tabs('a');
			jt_pays.getSelectionModel().clearSelection();
			jt_regions.getSelectionModel().clearSelection();
			jt_departements.getSelectionModel().clearSelection();
			jt_villes.getSelectionModel().clearSelection();
			jt_quartiers.getSelectionModel().clearSelection();
			jt_activites.getSelectionModel().clearSelection();
			search();

		}
		if(source==lieux)
		{
			new List_Lieux(this);
		}
		if(source==activites)
		{
			new List_Activites(this);
		}
		if(source==newContact)
		{
			new Edit_Personne(this, new Personne(-1, "", "", new java.util.Date(), aDAO.find(0)));
		}
		if(source==editContact)
		{
			if(result.getSelectedRow()<0 || (int)model.getValueAt(0, 3)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucune personne n'est séléctionnée.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Edit_Personne(this, pDAO.find((int)model.getValueAt(result.getSelectedRow(), 3)));
		}
		if(source==supprContact)
		{
			if(result.getSelectedRow()<0 || (int)model.getValueAt(0, 3)==-1)
			{
				JOptionPane.showMessageDialog(this.getContentPane(), "aucune personne n'est séléctionnée.", "Oh zut!", JOptionPane.ERROR_MESSAGE);
				return;
			}
			new Del_Personne(this, pDAO.find((int)model.getValueAt(result.getSelectedRow(), 3)));
		}
	}


	@Override
	public void componentHidden(ComponentEvent e) {
		// TODO Auto-generated method stub

	}


	@Override
	public void componentMoved(ComponentEvent e) {
		// TODO Auto-generated method stub

	}


	@Override
	public void componentResized(ComponentEvent e) {
		// TODO Auto-generated method stub

	}


	@Override
	public void componentShown(ComponentEvent e) {
		search();
		update_tabs('a');

	}


	@Override
	public void valueChanged( ListSelectionEvent e)
	{
		Object source = e.getSource();
		if(source == jt_pays.getSelectionModel()&& e.getFirstIndex() >= 0 )
		{
			update_tabs('p');
		}
		else if(source== jt_regions.getSelectionModel()&& e.getFirstIndex() >= 0)
		{
			update_tabs('r');
		}
		else if(source== jt_departements.getSelectionModel()&& e.getFirstIndex() >= 0)
		{
			update_tabs('d');
		}
		else if(source== jt_villes.getSelectionModel()&& e.getFirstIndex() >= 0)
		{
			update_tabs('v');
		}
		else if(source== jt_quartiers.getSelectionModel()&& e.getFirstIndex() >= 0)
		{

		}
	}

	private void update_tabs(char c){
		if(c=='a')
		{
			pModel.setNewData(paysDAO.findAll());
			jt_pays.setModel(pModel);
			jt_pays.revalidate();
			jt_pays.repaint();
			rModel.reset();
			jt_regions.setModel(rModel);
			jt_regions.revalidate();
			jt_regions.repaint();
			dModel.reset();
			jt_departements.revalidate();
			jt_departements.repaint();
			vModel.reset();
			jt_villes.revalidate();
			jt_villes.repaint();
			qModel.reset();
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
		}		
		if(jt_pays.getSelectedRow()>=0 && c=='p')
		{
			liste_regions=rDAO.findByPays((int)pModel.getValueAt(jt_pays.getSelectedRow(), 1));
			rModel.setNewData(liste_regions);
			jt_regions.setModel(rModel);
			jt_regions.revalidate();
			jt_regions.repaint();
			dModel.reset();
			jt_departements.revalidate();
			jt_departements.repaint();
			vModel.reset();
			jt_villes.revalidate();
			jt_villes.repaint();
			qModel.reset();
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
		}
		if(jt_regions.getSelectedRow()>=0 && c=='r')
		{
			liste_departements=dDAO.findByRegion((int)rModel.getValueAt(jt_regions.getSelectedRow(), 1));
			dModel.setNewData(liste_departements);
			jt_departements.setModel(dModel);
			jt_departements.revalidate();
			jt_departements.repaint();
			vModel.reset();
			jt_villes.revalidate();
			jt_villes.repaint();
			qModel.reset();
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
		}
		if(jt_departements.getSelectedRow()>=0 && c=='d')
		{
			liste_villes=vDAO.findbyDepartement((int)dModel.getValueAt(jt_departements.getSelectedRow(), 1));
			vModel.setNewData(liste_villes);
			jt_villes.setModel(vModel);
			jt_villes.revalidate();
			jt_villes.repaint();
			qModel.reset();
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
		}
		if(jt_villes.getSelectedRow()>=0 && c=='v')
		{
			liste_quartiers=qDAO.findByVille((int)vModel.getValueAt(jt_villes.getSelectedRow(), 1));
			qModel.setNewData(liste_quartiers);
			jt_quartiers.setModel(qModel);
			jt_quartiers.revalidate();
			jt_quartiers.repaint();
		}



	}
}

